#! /usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys, getopt
from shutil import copyfile

def convKiss2ToDot(kiss2_file_path):
    """将 kiss2 文件转换为 dot"""

    f_kiss = open(kiss2_file_path,'r') # 读取 kiss2 文件

    # 新建 dot 文件
    dot_file_path = kiss2_file_path.replace('kiss2','dot') 
    f_dot = open(dot_file_path,'w') 

    f_dot.write('digraph fsm {\nsplines=ortho\n') # 写入 dot 文件开头

    # 转换过程
    for line in f_kiss:
        if not line.startswith("."):
            in_bits, from_state, to_state, out_bits = line.split()
            f_dot.write("%s -> %s [label=\"IN=%s,\\nOUT=%s\"];\n" % (from_state, to_state,
                    in_bits.replace("-", "?"), out_bits.replace("-", "?")))
    
    f_dot.write("}\n")

    # 关闭文件
    f_kiss.close()
    f_dot.close()
    pass


YOSYS_ExtractFsmCmd = 'yosys -p \'proc; fsm_detect; fsm_extract; fsm_export;\' '
helpInfo = '用法: python3 fsm_extract.py -i <Verilog-Src-Path>\n'
helpInfo = helpInfo + '本脚本基于 Yosys 工具， 具体安装方法，请参考 https://github.com/YosysHQ/yosys.git 内的相关文档'
helpInfo = helpInfo + '其中， kiss2 转 dot 的方法来自 CliffordVienna 在 https://stackoverflow.com/questions/32645965/fsm-export-using-yosys 中的回答'

if __name__ == '__main__':

    path = '/home/rv/Downloads/bench01/obj'
    ''' 获取指定目录下的所有指定后缀的文件名 '''

    # 定义参数列表
    try:
        opts, args = getopt.getopt(sys.argv[1:],"hi:o:",["ifile=","ofile="])
    except getopt.GetoptError:
        print(helpInfo)
        sys.exit(2)

    # 解析送入的参数
    for opt, arg in opts:
        if opt == '-i':
            verilogSrcPath = arg
        else:
            print(helpInfo)

    # 运行 yosys 提取 FSM
    cmd = YOSYS_ExtractFsmCmd + verilogSrcPath
    os.system(cmd)


    f_list = os.listdir() # 读取所在目录文件列表
    for i in f_list:
        # os.path.splitext():分离文件名与扩展名
        if os.path.splitext(i)[1] == '.kiss2':
            str_i = i.replace('.kiss2','') # 删除后缀

            # 删除包含特殊符号 $ 的部分
            str_i = i.replace('$fsm$\\','')

            n = str_i.find('$')
            str_i = str_i[0:n] + '.kiss2'
            print(f'{str_i}')
            # os.system(f'cp {i} {str_i}')
            copyfile(i,str_i)
            os.remove(i)
            convKiss2ToDot(str_i)